﻿/*!
* jQuery grid plugin: 
* 
* version 0.1 2010-11-08
* Requires jQuery v1.4.2 or later
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
* Authors: Kim Seoung Min
* Company : Kongyoung DB


Sample : $('#Table1').showgrid(obj, {width: 200, height: 150});
{
colNames: ['Id', 'Votes', 'Title'],
colModel: [
    { name: 'Id',    index: 'Id',    width: 140, align: 'left' },
    { name: 'Votes', index: 'Votes', width: 140, align: 'left', editable: 'true' },
    { name: 'Title', index: 'Title', width: 200, align: 'left' }
  ],
    rowNum: 20,
    ShowRowNum: true,
    multiselect: true,
    rowList: [2, 20, 30],
    pager: '#pager',
    sortname: 'Id',
    datatype: 'local',
    viewrecords: true,
    sortname: 'name',
    sortorder: "desc",
    height: 'auto',
    caption: "JSON Example"
}
*/

$.fn.tableScroll.defaults =
{
    flush: true, // makes the last thead and tbody column flush with the scrollbar
    width: null, // width of the table (head, body and foot), null defaults to the tables natural width
    height: 100, // height of the scrollable area
    containerClass: 'tablescroll' // the plugin wraps the table in a div with this css class
};

(function ($) {

    $.fn.showgrid = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.tooltip');
        }
    };

    var methods = {
        init: function (JsonForm, size) {
            /////////////////////////////////////////////////////////////////
            if ($(this).find(' > thead').length == 0) {
                $(this).tableScroll('undo');
            }
            //////////////////////////////////////////////////////

            for (var m in JsonForm){
//                function json2xml(o, tab) {
//   var toXml = function(v, name, ind) {
//      var xml = "";
//      if (v instanceof Array) {
//         for (var i=0, n=v.length; i<n; i++)
//            xml += ind + toXml(v[i], name, ind+"\t") + "\n";
//      }
//      else if (typeof(v) == "object") {
//         var hasChild = false;
//         xml += ind + "<" + name;
//         for (var m in v) {
//            if (m.charAt(0) == "@")
//               xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
//            else
//               hasChild = true;
//         }
//         xml += hasChild ? ">" : "/>";
//         if (hasChild) {
//            for (var m in v) {
//               if (m == "#text")
//                  xml += v[m];
//               else if (m == "#cdata")
//                  xml += "<![CDATA[" + v[m] + "]]>";
//               else if (m.charAt(0) != "@")
//                  xml += toXml(v[m], m, ind+"\t");
//            }
//            xml += (xml.charAt(xml.length-1)=="\n"?ind:"") + "</" + name + ">";
//         }
//      }
//      else {
//         xml += ind + "<" + name + ">" + v.toString() +  "</" + name + ">";
//      }
//      return xml;
//   }, xml="";
//   for (var m in o)
//      xml += toXml(o[m], m, "");
//   return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, "");
//}


            }


            var chkclass = JsonForm.ShowRowSelect ? 'show_td' : 'hidn_td';
            var IDclass = JsonForm.ShowRowNum ? 'show_td' : 'hidn_td';
            var CRUDclass = JsonForm.ShowCRUD ? 'show_td' : 'hidn_td';
            var colCount = JsonForm.colModel.length;
            var rowNum = JsonForm.rowNum;
            var th = "<td class='"+chkclass+" tdCHK'>!</td>";
            var td = "<td class='"+chkclass+" tdCHK'> <input type='checkbox' /></td>";
            th += "<td class='"+IDclass+" tdID'>No</td>";
            td += "<td class='"+IDclass+" tdID'>&nbsp;</td>";
            th += "<td class='"+CRUDclass+" tdCURD'>CRUD</td>";
            td += "<td class='"+CRUDclass+" tdCURD'>&nbsp;</td>";

            /// : 초기테이블 해드와 row를 생성한다 ////////////////////////////////////////////
            for (var i = 0; i < colCount; i++) {
                var _index = JsonForm.colModel[i].index;
                var _width = JsonForm.colModel[i].width;
                var _caption = JsonForm.colModel[i].name;
                var _align = JsonForm.colModel[i].align;
                var _type = JsonForm.colModel[i].type
                var _code = JsonForm.colModel[i].code

                var _tdCss = JsonForm.colModel[i].type == "hidden"?"hidn_td":"show_td"; //"hidn_td":"show_td";
                var _style=" style='width: " + _width + ";text-align:" + _align + ";' class='"+_tdCss+"'  field='"+_index+"' ftype= '"+_type+"' code= '"+_type+"'  " ;

                th += "<td class='"+_tdCss+"' field='"+_index+"' >" + _caption + "</td>";

                switch (_type) {
                    case 'integer':
                        td += "<td "+_style+"'><input type='text' class='gridTextNum' value='' oldvalue = ''/></td>";
                        break;
                    case 'string':
                        td += "<td "+_style+"'><input type='text' class='gridTextBox' value='' oldvalue = ''/></td>";
                        break;
                    case 'combo':
                        // 콤보박스 바인딩처리용 옵션리스트를 미리 정의하여 저장하여 둔다
                        if (_code != undefined && _code != ""  && _code != null) {
                            var pl = new JSONClientParameters();
                            pl.add("CODETY", _code);
                            var jdata = PostJsonSync("/bzService/superboard.asmx/GETCOMCODE", pl);
                            var selHtml = "";
                                $.each(jdata, function (index, value) {
                                selHtml += String.format("<option value='{0}'>{1}</option>", value.CodeID, value.CodeNAME);
                            });
                            td += "<td "+_style+"'><select class='gridCombo' value='' oldvalue = ''>"+selHtml+"</select></td>";
                        }
                        break;
                    default:
                        td += "<td "+_style+"'>&nbsp;</td>";
                }
            }

            //// head 생성 ///////////////////////////////////////////////////////////////////////////////////////////////
            th = "<tr>" + th + "</tr>"; //-->> No 항목 + 설정된 항목 헤더 바인딩
            $(this).find('thead').html(th);
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////

            ////// body 생성 /////////////////////////////////////////////////////////////////////////////////////////////
            td = "<tr>" + td + "</tr>";
            tb = "";
            for (var i = 0; i < rowNum; i++) {tb += td;}
            this.find('> tbody').html(tb);

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // 제사용이 가능하도록 구조정보를 보관한다.
            $(this).data("formatData", JsonForm);
            $(this).data("TRdata",this.find('> tbody tr:last'));

            /// scroll 처리 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
            if (size.width == 0) size.width = $(this).parent().outerWidth()-20;
            if (size.height == 0) size.height = $(this).parent().outerHeight();
            $(this).tableScroll(size);
             $(this).find('> tbody tr').remove();
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            return this;
        },

        GetformatData: function () {
            return $(this).data("formatData") ;
        },


        ShowData0: function (pl) {
            $(this).data("filter",pl); 
            var JsonForm =  $(this).data("formatData"); 
            pl.add("pagecnt",JsonForm.rowNum);
            pl.add("viewpage",1);
            pl.add("OrderStr",JsonForm.Orderby);
            var loader = jQuery('<div><img src="/image/spinner.gif" /><br>Loading...</div>');
            $(this).hide();
            loader.prependTo($(this).parent());
            var myDiv = $(this);    
            PostJsonData("/bzService/superboard.asmx/CustomerPage", pl,function (data) {
                doSomething(data, myDiv) ;
                loader.remove();
                myDiv.show();
            });
        },

        ShowPage: function (page) {
            pl = $(this).data("filter"); 
            var JsonForm =  $(this).data("formatData"); 
            
            pl.add("pagecnt",JsonForm.rowNum);
            pl.add("viewpage",page);
            pl.add("OrderStr",JsonForm.Orderby);
            var loader = jQuery('<div><img src="/image/spinner.gif" /><br>Loading...</div>');
            $(this).hide();
            loader.prependTo($(this).parent());
            var myDiv = $(this);    
            PostJsonData("/bzService/superboard.asmx/CustomerPage", pl,function (data) {
                doSomething(data, myDiv) ;
                loader.remove();
                myDiv.show();
            });
        },

        SortPage: function (SortField) {
            var JsonForm =  $(this).data("formatData"); 

            var _var = JsonForm.Orderby.split(' ');
            if (SortField == _var[0]) {
                JsonForm.Orderby = SortField + (_var[1]=="ASC"?" DESC":" ASC");
            }
            else {
                JsonForm.Orderby = SortField + " ASC";
            }
            
            $(this).data("formatData", JsonForm);
             this.showgrid("ShowPage",1);
        },


        ShowData: function (JsonData, TRCOUNT, VIEWPAGE, TPCOUNT) {
            this.showgrid("ClearData");
            var JsonForm =  $(this).data("formatData"); 
            var TrData = $(this).data("TRdata");
            var Rows = JsonData.length;
            $(this).parent().parent().find('> .tablescroll_foot').html("<tr><td><a>"+Rows+" Records. </a></td><td>0 Selected<td><td><td><td><td><tr>");
            if (Rows == 0)  {return 0 ;}

            for (var i = 0; i < Rows; i++) {
                var DataRow = JsonData[i];
                var td = "";
                var newTr = TrData.clone();
                newTr.attr("key", DataRow[JsonForm.keyname]);
                newTr.find('td').each(function(index){
                    if( index == 0 ) return true; //continue;

                    var _ftype = $(this).attr('ftype');
                    var _field = $(this).attr('field');
                    var _code = $(this).attr('code');
                    if (_field != "" && _field != undefined ){
                        var data = DataRow[_field];
                     }
                    switch (_ftype) {
                        case 'integer':
                            if (data == "undefined" || data == null || data =="") data = "0";
                            data = number_format(data);
                            $(this).find("input:first").val(data).attr("oldvalue", data);
                            break;
                        case 'string':
                            if (data == "undefined" || data == null || data =="") data = "";
                            $(this).find("input:first").val(data).attr("oldvalue", data);
                            break;
                        case 'combo':
                            if (data == "undefined" || data == null || data =="") data = "";
                            $(this).find("select:first").val(data).attr("oldvalue", data);
                            break;
                        default:
                            if (data == "undefined" || data == null || data =="") data = "&nbsp;";
                            $(this).html(data)
                   }
                });
                newTr.find('td:eq(1)').html(i+1);
                newTr.find('td:eq(2)').html('R');
                $(this).find('> tbody').append(newTr);
            }
            
//            var myDiv = $(this); 
//            $(this).parent().parent().find('> .tablescroll_head thead tr td').unbind("click").bind("click",function(e){
//            // 테이블 해드클릭시 정렬시키는 루틴
//                myDiv.showgrid("SortPage",$(this).attr('field'));
//            });            
//            

//            $(this).find('> tbody tr').mouseover(function() { $(this).addClass("tablescroll_tbody_tr_focus") }).mouseout(function() { $(this).removeClass("tablescroll_tbody_tr_focus") });

//            $(this).find('tr').unbind("click").bind("click", function(e){ 
//                $(this).parent().parent().data("SelectRowIndex", $(this));
//                //alert($(this).attr("key"));
//            });
//            $(this).find('tr').bind("click", function (e) {
//                $(this).parent().find('tr').removeClass('tablescroll_tbody_tr_select'); // 행클릭시 모든행의 색상을 white
//                $(this).addClass('tablescroll_tbody_tr_select');						// 행클릭시 선택된 행 색상.
//            });

//            $(this).find('tr').bind("click", JsonForm.trClick);

//            $(this).find('td').unbind("mouseover").bind("mouseover", JsonForm.tdMouseover);

//            //$(this).find('input, select').change(JsonForm.tdChange);
//            $(this).find('td').change(function(){
//                if (this.cellIndex == 0) return ;
//                 
//                var _value = $(this).find(':first-child').val();
//                var _oldvalue = $(this).find(':first-child').attr('oldvalue');
//                if (_value != _oldvalue)
//                    $(this).addClass("changeTD")
//                else
//                    $(this).removeClass("changeTD")

//                // 만일 변경된 내용이 있다면 tr을 업데이트 대상으로 처리한다.
//                if ($(this).parent().find(".changeTD").length > 0){
//                    switch ($(this).parent().find('td:eq(2)').html()) {
//                        case 'R':
//                            $(this).parent().find('td:eq(2)').html('U');
//                            break;
//                        default:
//                    }
//                }
//                else {
//                    switch ($(this).parent().find('td:eq(2)').html()) {
//                        case 'U':
//                            $(this).parent().find('td:eq(2)').html('R');
//                            break;
//                        default:
//                    }
//                }
//            });

//            $(this).find('td').change(JsonForm.tdChange);


            $(this).parent().parent().find('> .tablescroll_foot td:eq(3)').html(String.format(" 총자료수 : {0} /  총페이지수 : {1} / 현재페이지 : {2}",TRCOUNT, TPCOUNT, VIEWPAGE ));

            /* page dispplay  --------------------------------------------------- */

            var ViewNum = "";
            var StartPagenum = parseInt((VIEWPAGE-1)/10)*10;
            ViewNum += "<a class='pgNum' pgnum='1'>&nbsp;|&lt;&nbsp;<a>";
            ViewNum += "<a class='pgNum' pgnum='"+(StartPagenum>10?StartPagenum:1)+"'>&nbsp;&lt;&nbsp;<a>";

            for(i=StartPagenum+1 ; i<TPCOUNT*1+1 && i < (StartPagenum*1+11)   ; i++)
            {
               if (VIEWPAGE*1 == i){ ViewNum += "<a class='pgNum pgNumNow' pgnum='"+i+"'>&nbsp;"+ i +"&nbsp;<a>"; }
               else{ViewNum += "<a class='pgNum' pgnum='"+i+"'>&nbsp;"+ i +"&nbsp;<a>";}
            } 

            ViewNum += "<a class='pgNum' pgnum='"+(i<TPCOUNT*1+1?StartPagenum+11:TPCOUNT)+"'>&nbsp;&gt;&nbsp;<a>";
            ViewNum += "<a class='pgNum' pgnum='"+TPCOUNT+"'>&nbsp;&gt;|&nbsp;<a>";
            $(this).parent().parent().find('> .tablescroll_foot td:eq(2)').html(ViewNum);

            /* page dispplay  --------------------------------------------------- */

            
//            $(this).parent().parent().find('> .tablescroll_foot .pgNum').mouseover(function() { $(this).addClass("pgNumOver") }).mouseout(function() { $(this).removeClass("pgNumOver") });

//             var myDiv = $(this); 
//            $(this).parent().parent().find('> .tablescroll_foot .pgNum').unbind("click").bind("click", function(e) {
//                myDiv.showgrid("ShowPage",$(this).attr('pgnum'));
//            });

            var SortField = JsonForm.Orderby.split(' ');
            
            $(this).parent().parent().find('> .tablescroll_head thead tr td').removeClass('td_SortAsc').removeClass('td_Sortdesc');
            _obj = $(this).parent().parent().find('> .tablescroll_head thead tr td[field="'+SortField[0]+'"]');
            var _sortclass = (SortField[1]=="ASC"?"td_SortAsc":"td_Sortdesc");
            _obj.addClass(_sortclass);

            this.showgrid("BindAction");
            return Rows;
        },

        BindAction: function() {

            var JsonForm =  $(this).data("formatData"); 

            var myDiv = $(this); 
            $(this).parent().parent().find('> .tablescroll_head thead tr td').unbind("click").bind("click",function(e){
                // 테이블 해드클릭시 정렬시키는 루틴
                if (this.cellIndex == 0) { alert('전체선택'); 
                    myDiv.find('tbody tr').find('> td:first').find('input').toggle();                
                    return; 
                }
                _field = $(this).attr('field') ;
                if (_field != undefined) {
                    myDiv.showgrid("SortPage",$(this).attr('field'));
                }
            });            
            

            $(this).find('> tbody tr').mouseover(function() { $(this).addClass("tablescroll_tbody_tr_focus") }).mouseout(function() { $(this).removeClass("tablescroll_tbody_tr_focus") });

            $(this).find('tr').unbind("click").bind("click", function(e){ 
                $(this).parent().parent().data("SelectRowIndex", $(this));
                //alert($(this).attr("key"));
            });
            $(this).find('tr').bind("click", function (e) {
                $(this).parent().find('tr').removeClass('tablescroll_tbody_tr_select'); // 행클릭시 모든행의 색상을 white
                $(this).addClass('tablescroll_tbody_tr_select');						// 행클릭시 선택된 행 색상.
                // 향후 체크박스가 아닌 클릭이벤트동작시에 적용하기로 함
                if(e.ctrlKey) {    //Ctrl+Click  
                 //  $(this).addClass('tablescroll_tbody_tr_checked')						// 행클릭시 선택된 행 색상.
                 //  $(this).find('td:eq(0)').find('input').attr("checked", "checked");
                };
            });

            $(this).find('tr').bind("click", JsonForm.trClick);

            $(this).find('td').unbind("mouseover").bind("mouseover", JsonForm.tdMouseover);

            //$(this).find('input, select').change(JsonForm.tdChange);
            $(this).find('td').change(function(){
                if (this.cellIndex == 0) {
                    _cnt = $(this).find('input:checked').length;
                    if (_cnt == 0) {
                        $(this).parent().removeClass('tablescroll_tbody_tr_checked');
                    }
                    else
                    {
                        $(this).parent().addClass('tablescroll_tbody_tr_checked');
                    }

                  _chkCnt = $(this).parent().parent().find('tr').find('> td:first').find('input:checked').length;
                  $(this).parent().parent().parent().parent().parent().find('> .tablescroll_foot td:eq(1)').html(_chkCnt+ ' Selected');
                  
                 return ;
                }
                 
                var _value = $(this).find(':first-child').val();
                var _oldvalue = $(this).find(':first-child').attr('oldvalue');
                if (_value != _oldvalue)
                    $(this).addClass("changeTD")
                else
                    $(this).removeClass("changeTD")

                // 만일 변경된 내용이 있다면 tr을 업데이트 대상으로 처리한다.
                if ($(this).parent().find(".changeTD").length > 0){
                    switch ($(this).parent().find('td:eq(2)').html()) {
                        case 'R':
                            $(this).parent().find('td:eq(2)').html('U');
                            $(this).parent().find('td:eq(0)').find('input').attr("checked", "checked");
                            $(this).parent().addClass('tablescroll_tbody_tr_checked');
                            break;
                        default:
                    }
                }
                else {
                    switch ($(this).parent().find('td:eq(2)').html()) {
                        case 'U':
                            $(this).parent().find('td:eq(2)').html('R');
                            break;
                        default:
                    }
                }
            });

            $(this).find('td').change(JsonForm.tdChange);


            $(this).parent().parent().find('> .tablescroll_foot .pgNum').mouseover(function() { $(this).addClass("pgNumOver") }).mouseout(function() { $(this).removeClass("pgNumOver") });

             var myDiv = $(this); 
            $(this).parent().parent().find('> .tablescroll_foot .pgNum').unbind("click").bind("click", function(e) {
                myDiv.showgrid("ShowPage",$(this).attr('pgnum'));
            });


        },
        // 검색결과가 1건인 경우 바로 GridClick 이벤트를 실행함. 2011/02/13 by 최보현
        AddRow: function () {
            var TrData = $(this).data("TRdata").clone();
            TrData.find('td:eq(2)').html("C");
            $(this).find('> tbody').append(TrData);
            this.showgrid("BindAction");
        },

        DeleteRow: function () {
           // var TrData = $(this).data("SelectRowIndex");
           //$(this).parent().parent().find('> .tablescroll_foot td:eq(2)').html(ViewNum);
            $(this).find('tbody tr').find('> td:first').find('input:checked').each(function(index){
                var TrData = $(this).parent().parent();
                var _CRUD = TrData.find('td:eq(2)').html() ;
                if (_CRUD == "C"){TrData.remove();}
                if (_CRUD == "R" || _CRUD == "U"){TrData.find('td:eq(2)').html("D"); TrData.hide()}
                if (_CRUD == "D"){TrData.find('td:eq(2)').html("R");}
            });
            // select:first  .find('input:checked') > td:first')
            //alert(cnt + '개가 선택되었습니다');
            //alert("delete  - "+TrData.attr("key"));
//            var _CRUD = TrData.find('td:eq(2)').html() ;
//            if (_CRUD == "C"){TrData.remove();}
//            if (_CRUD == "R" || _CRUD == "U"){TrData.find('td:eq(2)').html("D"); TrData.hide()}
//            if (_CRUD == "D"){TrData.find('td:eq(2)').html("R");}

        },

        ShowData2: function (JsonData) {
            // 미사용
            this.showgrid("ClearData");
            
            var JsonForm =  $(this).data("formatData"); 
            var IDclass = JsonForm.ShowRowNum ? 'show_id' : 'hidn_id';
            var Rows = JsonData.length;
            var colCount = JsonForm.colModel.length;
            var tbody = "";
            for (var i = 0; i < Rows; i++) {
                var td = "";
                var DataRow = JsonData[i];

                for (var j = 0; j < colCount; j++) {
                    var tdCss = (JsonForm.colModel[j].type == "hidden") ? "hidn_td" : "show_td";
                    var tdCss = "show_td";
                    var _width = JsonForm.colModel[j].width;
                    var _align = JsonForm.colModel[j].align;
                    if (JsonForm.colModel[j].type == "hidden") {
                        tdCss = "hidn_td";
                        _width = "0px";
                    }
                    var data = DataRow[JsonForm.colModel[j].index];
                    if (data == "undefined" || data == null) data = "&nbsp;";

                    /*
                    if(data.length > 40) {					
                    data = Left(data,40) + "..." ;
                    }
                    */

                    td += "<td style='width: " + _width + ";text-align:" + _align + ";' class='" + tdCss + "' gClear' field='" + JsonForm.colModel[j].index + "'>" + data + "</td>";
                    // td += "<td class='"+tdCss+" gClear' field='"+JsonForm.colModel[j].index+"' editable='false' style='text-align:"+ JsonForm.colModel[j].align+";width:"+ JsonForm.colModel[j].width+";'>"+DataRow[JsonForm.colModel[j].index]+"</td>";
                }
                var rownum = i + 1
                tbody += "<tr key='" + DataRow[JsonForm.keyname] + "' ><td class='" + IDclass + "'><a class='tablescroll_rownum'>" + rownum + "</a></td>" + td + "</tr>";
            }

            $(this).find('tbody').html(tbody);
            //$(this).find('> tbody tr td .gridTextBox').focus(function() { $(this).addClass("inputTextBox_focus") }).mouseover(function() { $(this).addClass("inputTextBox_focus") }).focusout(function() { $(this).removeClass("inputTextBox_focus") }).mouseout(function() { $(this).removeClass("inputTextBox_focus") });
            //$(this).find('> tbody tr').focus(function() { $(this).addClass("tablescroll_tbody_tr_focus") }).mouseover(function() { $(this).addClass("tablescroll_tbody_tr_focus") }).focusout(function() { $(this).removeClass("tablescroll_tbody_tr_focus") }).mouseout(function() { $(this).removeClass("tablescroll_tbody_tr_focus") });

            // 2011/01/06 행클릭시 색상부여.
            $(this).find('tr').bind("click", function (e) {
                $(this).parent().find('tr').css('background-color', '#ffffff'); // 행클릭시 모든행의 색상을 white
                $(this).css('background-color', 'ffffdc'); 							// 행클릭시 선택된 행 색상.
            });
    
        },

        // 검색결과가 1건인 경우 바로 GridClick 이벤트를 실행함. 2011/02/13 by 최보현
        RowClick: function (RowNum) {
            try {
                //alert($(this).find(String.format('> tbody tr:eq({0})', RowNum)).attr('key'));
                $(this).find(String.format('> tbody tr:eq({0})', RowNum)).trigger('click');
            } catch (e) {
                alert(e.message);
            }
        },


        ClearData: function () {
        $(this).find('> tbody tr').remove();
        //    var tbody = $(this).find('> tbody .gClear').html("&nbsp;");
        //    var tbody = $(this).find('> tbody .gClearNum').val("0");
        //    var tbody = $(this).find('> tbody .gClearStr').val("");
        },

        // 초기화 버튼 클릭시 그리드 초기화. 2011/02/11 by 최보현
        ClearData2: function () {
            $(this).find('> tbody tr').remove();
        },

        Click: function (clickFun) {
            $(this).find('> tbody tr').bind("click", clickFun);
        },

        tr_Mouseover: function (clickFun) {
            $(this).find('> tbody tr').bind("mouseover", clickFun);
        },

        GetData2: function(JsonData) {
            var tbody = $(this).find('> tbody');
            var Rows = tbody.find('> tr').length;
            var Cols = tbody.find('> tr:eq(0) td').length;
            var Records = 0;
            var RetXml = "<?xml version='1.0' encoding='utf-8' ?><DataTable>";
            for (var i = 0; i < Rows; i++) {
                var row = tbody.find(String.format('tr:eq({0})', i));
              // $(this).parent().parent().find('tr').find('> td:first').find('input:checked').length

                if (row.find("> td .tablescroll_tr_chk").attr("checked")) {
                    // if (row.attr("key") != "") {
                    Records++;
                    RetXml += "<Record>"
                    for (var j = 1; j < Cols; j++) {
                        var td = row.find(String.format('td:eq({0})', j));
                        var field = td.attr("field")
                        if (td.attr("editable") == 'true') {
                            switch (td.attr("type")) {
                                case 'integer':
                                    RetXml += String.format("<{0}>{1}</{0}>", field, td.find('> input').val());
                                    break;
                                case 'string':
                                    RetXml += String.format("<{0}>{1}</{0}>", field, td.find('> input').val());
                                    break;
                                case 'combo':
                                    RetXml += String.format("<{0}>{1}</{0}>", field, td.find('> select').val());
                                    break;
                                default:
                                    RetXml += String.format("<{0}>{1}</{0}>", field, td.find('> input').val());
                            }
                        }
                        else {
                            RetXml += String.format("<{0}>{1}</{0}>", field, td.html());
                        }

                    }
                    RetXml += "</Record>"
                }

            }
            RetXml += "</DataTable>"

            return RetXml;
        },

        GetData: function(JsonData) {
            var RetXml = "<?xml version='1.0' encoding='utf-8' ?><DataTable>";
            $(this).find('> tbody tr').find('> td:first').find('input:checked').each(function(index){
                var _tr = $(this).parent().parent();
                var _CRUD = _tr.find('td:eq(2)').html() ;
                var _key = _tr.attr('key');
                if (_CRUD == 'R') return true ;
                if (_CRUD == 'C') _key = 0;
                RetXml += "<Record>";
                RetXml += String.format("<_KEY>{1}</_KEY><_CRUD>{0}</_CRUD>", _CRUD, _key);
                if (_CRUD == 'D') {
                    RetXml += "</Record>";
                    return true;
                }
                var _CRUDFIELD = "";
                _tr.find('td').each(function(index){
                    var field = $(this).attr("field");
                    if (field == undefined) return true;
                    // 만일 변경된 TD가 아니면 continue
                    if ($(this).hasClass("changeTD")){
                         _CRUDFIELD += ","+field ;
                    }
                    else {
                        return true;
                    }

                    switch ($(this).attr("ftype")) {
                        case 'integer':
                            RetXml += String.format("<{0}>{1}</{0}>", field, $(this).find('> input').val());
                            break;
                        case 'string':
                            RetXml += String.format("<{0}>{1}</{0}>", field, $(this).find('> input').val());
                            break;
                        case 'combo':
                            RetXml += String.format("<{0}>{1}</{0}>", field, $(this).find('> select').val());
                            break;
                        default:
                             RetXml += String.format("<{0}>{1}</{0}>", field, $(this).html());
                    }
                });
                
                RetXml += "<_CRUDFIELD>"+_CRUDFIELD+"</_CRUDFIELD>";

                RetXml += "</Record>"
            });

            RetXml += "</DataTable>"

            return RetXml;
        },

        GetRowCount: function (options) {
            alert(options + "-" + "옵션입니다");
            return this;

        }
    };
})(jQuery);

String.format = function(text) {
    if (arguments.length <= 1) {
        return text;
    }
    var tokenCount = arguments.length - 2;
    for (var token = 0; token <= tokenCount; token++) {
        text = text.replace(new RegExp("\\{" + token + "\\}", "gi"), arguments[token + 1]);
    }
    return text;
};

function doSomething(data, myDiv) {
    myDiv.showgrid("ShowData", data.XDcustomers, data.TRCOUNT, data.VIEWPAGE, data.TPCOUNT);
} 


$.extend($.expr[':'], {
    focusable: function(element) {
        var nodeName = element.nodeName.toLowerCase(),
		tabIndex = $.attr(element, 'tabindex');

        return (/input|select|textarea|button|object/.test(nodeName)
			? !element.disabled
			: 'a' == nodeName || 'area' == nodeName
				? element.href || !isNaN(tabIndex)
				: !isNaN(tabIndex))

        // the element and all of its ancestors must be visible
        // the browser may report that the area is hidden
		&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
    }
});

// 내  용 : 왼쪽부터 string 잘라내기
// 작성자 : 최보현(bhchoi@00db.co.kr)
// 작성일 : 2011/01/11
function Left(String, Length)
{
	if (String == null)
		return (false);

	return String.substr(0, Length);
}